package ar.edu.utn.frsf.tpae.a2014.g02.persistence.model;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;

import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.CascadeType;

@Entity
@Table(name = "ped")
public class Pedido {

	@Id
	@Column(name = "ped_id")
	@SequenceGenerator(name = "SecuenciaPedido", sequenceName = "seq_ped", allocationSize = 1)
	@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SecuenciaPedido")
	private Integer id;

	@Column(name = "ped_dsc")
	private String descripcion;

	@Column(name = "ped_pso")
	private Double peso;

	@Column(name = "ped_vol")
	private Double volumen;

	@Column(name = "ped_dir_org")
	private String direccionOrigen;

	@Column(name = "ped_dir_dst")
	private String direccionDestino;

	@ManyToOne
	@JoinColumn(name = "ped_cli_id")
	private Cliente cliente;

	@ManyToOne
	@JoinColumn(name = "ped_adm_id")
	private Administrador administrador;

	@ManyToOne
	@JoinColumn(name = "ped_tra_id")
	private Transportista transportirsta;

	@Cascade({ CascadeType.SAVE_UPDATE })
	@OneToMany(mappedBy = "pedido", fetch = FetchType.EAGER)
	private List<HistorialPedido> historial;

	public Integer getId() {
		return id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public String getDescripcion() {
		return descripcion;
	}

	public void setDescripcion(String descripcion) {
		this.descripcion = descripcion;
	}

	public Double getPeso() {
		return peso;
	}

	public void setPeso(Double peso) {
		this.peso = peso;
	}

	public Double getVolumen() {
		return volumen;
	}

	public void setVolumen(Double volumen) {
		this.volumen = volumen;
	}

	public String getDireccionOrigen() {
		return direccionOrigen;
	}

	public void setDireccionOrigen(String direccionOrigen) {
		this.direccionOrigen = direccionOrigen;
	}

	public String getDireccionDestino() {
		return direccionDestino;
	}

	public void setDireccionDestino(String direccionDestino) {
		this.direccionDestino = direccionDestino;
	}

	public Cliente getCliente() {
		return cliente;
	}

	public void setCliente(Cliente cliente) {
		this.cliente = cliente;
	}

	public Administrador getAdministrador() {
		return administrador;
	}

	public void setAdministrador(Administrador administrador) {
		this.administrador = administrador;
	}

	public Transportista getTransportirsta() {
		return transportirsta;
	}

	public void setTransportirsta(Transportista transportirsta) {
		this.transportirsta = transportirsta;
	}

	public List<HistorialPedido> getHistorial() {
		if (historial == null) {
			historial = new ArrayList<HistorialPedido>();
		}
		return historial;
	}

	public void setHistorial(List<HistorialPedido> historial) {
		this.historial = historial;
	}

	/**
	 * Recupera la fecha de creacion del pedido.
	 * 
	 * @return {@link Date} de creacion
	 */
	public Date getFechaHoraCreacion() {
		Integer idActual = Integer.MAX_VALUE;
		HistorialPedido estadoActual = null;
		for (HistorialPedido historial : this.getHistorial()) {
			if (historial.getId() < idActual) {
				estadoActual = historial;
				idActual = estadoActual.getId();
			}
		}

		return estadoActual.getFechaHoraCambioEstado();
	}

	/**
	 * Recupera la fecha de entrega del pedido.
	 * 
	 * @return {@link Date} de creacion
	 */
	public Date getFechaHoraEntrega() {
		if (EstadoPedido.ENTREGADO.equals(this.getEstadoActual())) {
			for (HistorialPedido historial : this.historial) {
				if (EstadoPedido.ENTREGADO.equals(historial.getEstado())) {
					return historial.getFechaHoraCambioEstado();
				}
			}
		}
		return null;
	}

	/**
	 * El {@link EstadoPedido} actual del {@link Pedido}
	 * 
	 * @return EL {@link EstadoPedido}
	 */
	public EstadoPedido getEstadoActual() {
		Integer idActual = 0;
		HistorialPedido estadoActual = null;
		for (HistorialPedido historial : this.getHistorial()) {
			if (historial.getId() > idActual) {
				estadoActual = historial;
				idActual = estadoActual.getId();
			}
		}

		return estadoActual.getEstado();
	}
}
